Unidad 2: Herramientas para el manejo de datos
Manejo y Visualización de Datos
Maestría en Estadística Aplicada - FCEyE - UNR
1 Introducción
En esta unidad haremos un recorrido por los primeros pasos del proceso de análisis de datos:
- Importación
- Manipulación
- Validación
- Resumen
Las etapas siguientes (visualización, ajuste, comunicación, etc.) serán tratadas más adelante.
Paquetes necesarios de R:
library(readr)
library(readxl)
library(tidyr)
library(data.table)Comenzamos entonces estudiando la etapa de importación de la base, la cual es fundamental en cualquier proyecto de análisis de datos. Si cometemos algún error en este paso, todos los resultados obtenidos a futuro se verán comprometidos.
Aunque este aspecto es pocas veces tenido en cuenta, contar con una estrategia bien diseñada para el almacenamiento y la lectura de la base es fundamental para facilitar las tareas posteriores de análisis.
Existen incontables ejemplos que respaldan esta afirmación. Veamos algunos casos resonantes:
- El Departamento de Salud y Asistencia Social del Reino Unido "perdió" en octubre de 2020 unos 16.000 casos positivos de Covid-19 por usar una versión desactualizada de Excel para almacenar sus datos (Fuente: BBC).
- El comité científico encargado de la nomenclatura de genes humanos (HGNC) se vio obligado a renombrar 27 genes cuyos nombres eran confundidos con fechas por cierto software de almacenamiento de datos. Este problema causó que aproximadamente un 20% de los artículos publicados entre 2005 y 2015 en journals del área genética contengan errores (Fuente: BioNews).
- Durante la Guerra del Golfo (1990/91) un misil antiaéreo del ejército estadounidense falló debido a un problema de redondeo en el software utilizado, calculando erróneamente el tiempo transcurrido entre la detección de un misil enemigo y la hora actual. El error de redondeo (0.34 segundos cada 100 horas) trajo como consecuencia la muerte de 28 soldados estadounidenses (Fuente: Gobierno de EEUU).
Los ejemplos de este estilo son suficientes como para cubrir una clase entera, y dejan en claro que problemas graves de almacenamiento de datos pueden poner en riesgo no sólo nuestro puesto de trabajo o las finanzas de una empresa, sino también la salud pública, el avance científico y hasta la vida humana.
A continuación vamos a repasar dos casos problemáticos muy comunes:
Caso I: Recodificación
- Una (mala) costumbre bastante arraigada entre algunos/as analistas de datos consiste en no llamar a las cosas por su nombre. Es común encontrar bases de datos donde alguna variable categórica está codificada mediante números, por ejemplo:
\[Nacionalidad = \begin{cases} 1\text{ si es Argentino/a} \\ 2\text{ si es Extranjero/a} \end{cases}\]
Emplear números en lugar de las categorías reales potencia la posibilidad de cometer errores, ya que implica pasos extra de limpieza, transformación o recodificación de datos que son totalmente evitables.
En otros tiempos, esta manera de trabajar era necesaria debido a que el software disponible para análisis de datos (por ej. SPSS) no permitía cargar bases con variables cualitativas, creando la necesidad de generar diccionarios que relacionen categorías con cifras. Además, los dígitos ocupan menos memoria que palabras enteras, detalle importante cuando el espacio disponible era escaso (no olvidemos que un diskette \(3_{1/2}\) tenía menos de 2 MB de capacidad!!!).
Hoy en día, salvo por cuestiones legales relacionadas a la anonimidad de los datos, esta práctica debería tratar de evitarse a toda costa.
Caso II: Datos Faltantes
Otra mala costumbre consiste en reemplazar valores faltantes (datos desconocidos, perdidos,
NA, etc.) de variables numéricas por cifras fuera de escala, con la esperanza de que más adelante alguien se dé cuenta y los descarte.Ejemplo: no conozco la edad de una persona incluida en mi base de datos, y en vez de dejar la celda vacía, escribo "0", "-1" o bien "200". Esto es peor todavía que recodificar variables categóricas innecesariamente, ya que es muy fácil pasar por alto inconsistencias de este tipo en grandes bases, siendo el riesgo doble:
- Por un lado, vamos a creer que tenemos una base completa cuando en realidad hay muchos valores faltantes que no fueron identificados como tales; el tamaño de muestra real será menor al reportado, y la confianza en los resultados obtenidos, también.
- Si calculamos promedios, desvíos, o cualquier otra medida resumen de tipo numérico estaremos incorporando datos falsos al análisis.
- Por lo tanto, nunca está de más aclarar: no debemos usar valores numéricos para representar datos faltantes, ya que muy probablemente terminen causando errores en el análisis posterior.
Para finalizar esta introducción, aclaramos que cada proyecto de análisis de datos tendrá características particulares que lo diferenciarán del resto y, por lo tanto, no existe una única rutina "fija" de importación y limpieza que sirva para cualquier caso.
En lo que respecta a importar y/o limpiar una base, consideramos que un/a buen/a analista de datos se termina de formar con la experiencia práctica. Teniendo en cuenta esto, trataremos de presentar consejos generales y buenas prácticas para importar y manipular bases, poniendo mucho énfasis en las aplicaciones con ejemplos reales.
Durante esta clase vamos a aprender a:
- Preparar nuestros datos antes de la importación
- Importar los datos
- Chequear si fueron importados correctamente
- Solucionar algunos inconvenientes frecuentes
2 Datos ordenados
La expresión "Datos ordenados" (proveniente del término inglés tidy data) hace referencia a un conjunto de reglas utilizadas para almacenar datos de manera consistente. Puntualmente, se dice que un conjunto de datos "ordenado" debe cumplir las siguientes características:
- La información debe estar organizada de manera matricial o tabular, es decir, en una estructura coherente de filas y columnas.
- Cada fila de la base corresponde a una única observación o unidad muestral, ya sean éstas personas, plantas, objetos, regiones geográficas, etc. No puede haber información referida a más de un determinado individuo en una misma fila.
- Cada columna de la base corresponde a una única variable: no se almacena un mismo atributo en dos o más columnas diferentes, ni una misma columna puede contener más de un atributo al mismo tiempo.
Esta definición hace énfasis en el concepto de orden, y si bien inicialmente puede parecer algo arbitraria, el hecho de ubicar a los individuos en las filas y a las variables en las columnas nos ayudará a tener un panorama mucho más claro de los datos. Además, este formato resulta fácil de manipular mediante los paquetes de software estadístico más populares.
Para más detalles sobre este concepto recomendamos leer el siguiente artículo: Wickham, Hadley (2014). Tidy data. Journal of Statistical Software, Vol. 59.
Todos los datasets ordenados se parecen entre sí, pero cada dataset desordenado es desordenado a su propia manera
Adaptado de la novela Anna Karenina (1877) escrita por León Tolstoi («Todas las familias felices se parecen unas a otras, pero cada familia infeliz lo es a su manera»).
2.1 Ejemplo: Precios de Autos 0KM
Veamos un ejemplo concreto, donde comparamos la evolución del precio en pesos argentinos de ciertos modelos de autos. Los valores corresponden a precios vigentes en julio 2021, según datos oficiales extraídos de ACARA.
¿Cuáles de las siguientes tablas se encuentra en formato "ordenado"? ¿Cuántas variables hay en la base? ¿Y cuántas unidades tenemos?
| Marca | Modelo | 2018 | 2019 | 2020 | 2021 |
|---|---|---|---|---|---|
| Citroën | Berlingo | 1.459.200 | 1.552.300 | 1.651.400 | 2.020.600 |
| Citroën | C3 | 1.426.100 | 1.501.200 | 1.580.200 | 1.980.700 |
| Fiat | Argo | 1.340.000 | 1.420.000 | 1.500.000 | 2.219.400 |
| Fiat | Mobi | 910.000 | 980.000 | 1.070.000 | 1.586.400 |
| Ford | EcoSport | 1.732.600 | 1.874.900 | 2.062.400 | 2.715.000 |
| Ford | KA | 1.223.500 | 1.329.900 | 1.445.500 | 1.851.000 |
| Peugeot | 308 | 1.593.000 | 1.752.300 | 1.927.550 | 2.742.350 |
| Peugeot | 408 | 1.640.950 | 1.764.500 | 1.897.300 | 2.767.200 |
| Renault | Kangoo | 1.746.350 | 1.877.800 | 2.033.800 | 2.608.250 |
| Renault | Kwid | 880.000 | 968.000 | 1.064.800 | 1.651.600 |
| Toyota | Etios | 1.350.000 | 1.420.000 | 1.495.000 | 1.804.000 |
| Toyota | Innova | 3.145.000 | 3.445.000 | 3.750.000 | 4.938.500 |
| Volkswagen | Golf | 4.300.000 | 4.550.000 | 4.800.000 | 5.828.000 |
| Volkswagen | Polo | 1.575.000 | 1.675.000 | 1.775.000 | 2.287.950 |
| Modelo | Berlingo | C3 | Argo | Mobi | EcoSport | KA | 308 | 408 | Kangoo | Kwid | Etios | Innova | Golf | Polo |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2018 | 1.459.200 | 1.426.100 | 1.340.000 | 910.000 | 1.732.600 | 1.223.500 | 1.593.000 | 1.640.950 | 1.746.350 | 880.000 | 1.350.000 | 3.145.000 | 4.300.000 | 1.575.000 |
| 2019 | 1.552.300 | 1.501.200 | 1.420.000 | 980.000 | 1.874.900 | 1.329.900 | 1.752.300 | 1.764.500 | 1.877.800 | 968.000 | 1.420.000 | 3.445.000 | 4.550.000 | 1.675.000 |
| 2020 | 1.651.400 | 1.580.200 | 1.500.000 | 1.070.000 | 2.062.400 | 1.445.500 | 1.927.550 | 1.897.300 | 2.033.800 | 1.064.800 | 1.495.000 | 3.750.000 | 4.800.000 | 1.775.000 |
| 2021 | 2.020.600 | 1.980.700 | 2.219.400 | 1.586.400 | 2.715.000 | 1.851.000 | 2.742.350 | 2.767.200 | 2.608.250 | 1.651.600 | 1.804.000 | 4.938.500 | 5.828.000 | 2.287.950 |
| Marca | Modelo | Año | Precio |
|---|---|---|---|
| Citroën | Berlingo | 2018 | 1.459.200 |
| Citroën | Berlingo | 2019 | 1.552.300 |
| Citroën | Berlingo | 2020 | 1.651.400 |
| Citroën | Berlingo | 2021 | 2.020.600 |
| Citroën | C3 | 2018 | 1.426.100 |
| Citroën | C3 | 2019 | 1.501.200 |
| Citroën | C3 | 2020 | 1.580.200 |
| Citroën | C3 | 2021 | 1.980.700 |
| Fiat | Argo | 2018 | 1.340.000 |
| Fiat | Argo | 2019 | 1.420.000 |
| Fiat | Argo | 2020 | 1.500.000 |
| Fiat | Argo | 2021 | 2.219.400 |
| Fiat | Mobi | 2018 | 910.000 |
| Fiat | Mobi | 2019 | 980.000 |
| Fiat | Mobi | 2020 | 1.070.000 |
| Fiat | Mobi | 2021 | 1.586.400 |
| Ford | EcoSport | 2018 | 1.732.600 |
| Ford | EcoSport | 2019 | 1.874.900 |
| Ford | EcoSport | 2020 | 2.062.400 |
| Ford | EcoSport | 2021 | 2.715.000 |
| Ford | KA | 2018 | 1.223.500 |
| Ford | KA | 2019 | 1.329.900 |
| Ford | KA | 2020 | 1.445.500 |
| Ford | KA | 2021 | 1.851.000 |
| Peugeot | 308 | 2018 | 1.593.000 |
| Peugeot | 308 | 2019 | 1.752.300 |
| Peugeot | 308 | 2020 | 1.927.550 |
| Peugeot | 308 | 2021 | 2.742.350 |
| Peugeot | 408 | 2018 | 1.640.950 |
| Peugeot | 408 | 2019 | 1.764.500 |
| Peugeot | 408 | 2020 | 1.897.300 |
| Peugeot | 408 | 2021 | 2.767.200 |
| Renault | Kangoo | 2018 | 1.746.350 |
| Renault | Kangoo | 2019 | 1.877.800 |
| Renault | Kangoo | 2020 | 2.033.800 |
| Renault | Kangoo | 2021 | 2.608.250 |
| Renault | Kwid | 2018 | 880.000 |
| Renault | Kwid | 2019 | 968.000 |
| Renault | Kwid | 2020 | 1.064.800 |
| Renault | Kwid | 2021 | 1.651.600 |
| Toyota | Etios | 2018 | 1.350.000 |
| Toyota | Etios | 2019 | 1.420.000 |
| Toyota | Etios | 2020 | 1.495.000 |
| Toyota | Etios | 2021 | 1.804.000 |
| Toyota | Innova | 2018 | 3.145.000 |
| Toyota | Innova | 2019 | 3.445.000 |
| Toyota | Innova | 2020 | 3.750.000 |
| Toyota | Innova | 2021 | 4.938.500 |
| Volkswagen | Golf | 2018 | 4.300.000 |
| Volkswagen | Golf | 2019 | 4.550.000 |
| Volkswagen | Golf | 2020 | 4.800.000 |
| Volkswagen | Golf | 2021 | 5.828.000 |
| Volkswagen | Polo | 2018 | 1.575.000 |
| Volkswagen | Polo | 2019 | 1.675.000 |
| Volkswagen | Polo | 2020 | 1.775.000 |
| Volkswagen | Polo | 2021 | 2.287.950 |
El concepto de datos ordenados que acabamos de presentar se aplica generalmente en las etapas de almacenamiento y/o manipulación de la base, pero pierde fuerza durante la fase de comunicación y visualización. Esta distinción es importante, ya que la forma en que nos relacionamos con los datos dependerá de la etapa en la que nos encontremos.
Como vimos en este ejemplo, el formato ordenado (N° 3) resulta demasiado largo a la hora de publicar los datos. Dependiendo del espacio disponible en el documento a entregar, o bien de cuestiones estéticas, las visualizaciones 1 y 2 serán preferibles si necesitamos publicar la base entera.
Si bien las ocasiones en que debemos imprimir bases enteras en nuestros reportes es poco común, la moraleja que podemos extraer a partir del ejemplo es: un buen formato de almacenamiento no necesariamente es un buen formato de visualización, y al mismo tiempo, un buen formato de visualización no tiene por qué ser un buen formato de almacenamiento.
Por último, remarcamos que el formato ordenado tiende a presentar la información de un mismo individuo en varias filas diferentes (por ej. la información sobre un determinado modelo de auto está desparramada en 4 filas), situación que puede llegar a ser confusa para algunas personas.
Recordemos que una de las máximas del tidy data es asociar columnas con variables de manera biunívoca. Acomodar a cada modelo de auto en su propia fila, ocupando 4 columnas diferentes para registrar los precios (formato N° 1) es una violación de este principio.
¿Cómo hacemos para transformar nuestra base de datos de un formato "largo" (tidy) a uno "ancho", o viceversa? En R, el paquete tidyr provee las funciones
pivot_longer()ypivot_wider(), las cuales serán útiles en estos casos.
- Si tenemos una base en formato ancho, como en el caso de la visualización n° 1, y pretendemos pasarla al formato largo, aplicamos
pivot_longer()de esta manera:
library(tidyr)
pivot_longer(
data = autos_ancho, #Nombre del dataset que tiene formato ancho
cols = c(`2018`, `2019`, `2020`, `2021`) #Columnas que quiero apilar
)Notemos que esta transformación no consiste en transponer la base, sino en apilar registros uno debajo del otro, reduciendo la cantidad de columnas pero aumentando el número de filas.
A su vez, el paso de formato largo a ancho se da mediante
pivot_wider():
pivot_wider(
data = autos_largo, #Nombre del dataset que tiene formato largo
names_from = Año, #Variable cuyas categorías pasan a ser columnas
values_from = Precio #Variable que uso para rellenar las nuevas columnas
)Por cada valor distinto que haya en Año (en este caso 4 valores diferentes), la función
pivot_wider()creará una nueva columna, asignando a cada una de ellas los datos correspondientes que figuren en la variable Precio.En una transformación como esta debemos estar seguros/as de que cada combinación de las variables restantes (Marca, Modelo y Año) posean un único precio asociado; de lo contrario tendremos un problema a la hora de convertir la base.
Veamos un ejemplo simple para el modelo Toyota Etios, que ahora figura con 2 precios diferentes para el año 2021:
| Marca | Modelo | Año | Precio |
|---|---|---|---|
| Toyota | Etios | 2018 | 1.350.000 |
| Toyota | Etios | 2019 | 1.420.000 |
| Toyota | Etios | 2020 | 1.495.000 |
| Toyota | Etios | 2021 | 1.804.000 |
| Toyota | Etios | 2021 | 1.600.000 |
- El resultado que obtenemos al pasar esta base a formato ancho incluye una advertencia por parte de la función, siendo las columnas resultantes de tipo "lista" en vez de numérico:
Warning: Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates
| Marca | Modelo | 2018 | 2019 | 2020 | 2021 |
|---|---|---|---|---|---|
| Toyota | Etios | 1350000 | 1420000 | 1495000 | 1804000, 1600000 |
3 Tipos de archivos de datos
Para lo que viene, asumiremos que:
Ya hemos recolectado los datos necesarios para llevar a cabo nuestro análisis mediante encuestas, ensayos clínicos, estudios observacionales, exportación directa desde algún sistema de almacenamiento de datos, o cualquier otra metodología.
Guardamos la información en alguna base de datos accesible desde nuestra PC, ya sea en alguno de los formatos tradicionales (archivos de texto plano, Excel, etc.) o bien en cualquier otro medio digital que sea común dentro del ámbito donde nos desempeñamos.
Decidimos utilizar el software R para llevar a cabo el proceso de análisis.
R Base provee funciones que nos permiten importar archivos guardados en la mayoría de los formatos tradicionales, con la notable excepción de Excel, para lo cual necesitamos instalar un paquete específico.
A continuación repasaremos qué métodos existen para cada uno de estos formatos, y qué diferencias podemos encontrar entre las funciones tradicionales y las de paquetes especializados.
3.1 Formato txt
Corresponde a archivos de texto plano, llamados así porque no poseen ningún tipo de formato tipográfico extra (negrita, cursiva, tipo de fuente, etc.). Si bien generalmente los leemos desde el Bloc de Notas, su simplicidad permite que una gran variedad de programas puedan leer y editar su contenido. Cuando trabajamos con archivos txt es muy común usar tabulaciones como separadores de columnas, formato también conocido como tsv (tab-separated values).
Siempre que la estructura y/o tamaño de la base de datos lo permita, consideramos que esta es la manera más conveniente de compartir archivos. Además de la ya mencionada simplicidad, entre sus ventajas podemos agregar que ocupan poco espacio en disco, no traen problemas de incompatibilidad con versiones antiguas de sistemas operativos o software específico, y además evitamos la confusión de usar comas como separadores (cosa que ocurre con los archivos csv).
Datos Precios de Autos - Formato txt
- En R Base contamos con la función
read.table()para importar datos desde un txt:
read.table(
file = "C:/Mis Documentos/ArchivoImportante.txt", #Ruta del archivo
sep = "\t" #Separador: Tabulaciones
)- Por otro lado, el paquete readr nos ofrece la función
read_delim():
library(readr)
read_delim(
file = "C:/Mis Documentos/ArchivoImportante.txt", #Ruta del archivo
delim = "\t" #Separador: Tabulaciones
)Ambas funciones ofrecen la posibilidad de definir un sinfín de detalles específicos a cada archivo, como encabezados de columnas, tipos de variables, símbolos utilizados como separadores de miles o decimales, codificación, etc. Para más información, podemos consultar las páginas de ayuda en los manuales de sus respectivos paquetes.
Existen algunas diferencias entre ellas que son dignas de mencionar:
El formato del objeto de salida será data.frame si usamos
read.table()y tibble si usamosread_delim().Algunas de las opciones por defecto difieren, en especial el formato asignado a los diferentes tipos de variables y el hecho de considerar si los datos poseen encabezado o no.
Es fácil comprobar que
read_delim()es mucho más rápida a la hora de leer conjuntos de datos muy extensos. Otra función de importación de datos que se destaca por su rapidez esfread()del paquetedata.table.
- Para más detalles acerca de las diferencias entre data.frames y tibbles recomendamos consultar el capítulo 10.3 del libro R for Data Science. A grandes rasgos podemos decir que los tibbles, además de relacionarse de manera más fluida con las restantes funciones del tidyverse, toman las características esenciales de los data.frames y descartan ciertos comportamientos poco deseables asociados a formato de impresión, subseteo o tratamiento de variables categóricas.
3.2 Formato csv
Corresponde a archivos separado por comas (comma-separated values), y tal como ocurre con los txt, no poseen formato extra. En general podemos leerlos utilizando Excel o Bloc de Notas.
Si bien en la práctica se comportan como un txt que emplea comas para separar una columna de otra, poseen una desventaja: el hecho de reservar las comas como separador nos quita la posibilidad de utilizarlas como símbolo que da inicio a la parte decimal de un número. Además, para emplear comas dentro de una oración, tendremos que encerrar el texto entre comillas.
Frente a este problema, los sistemas operativos configurados en idioma español aplican un punto y coma ";" en lugar de la coma "," para separar columnas.
Datos Precios de Autos - Formato csv
- Para importar estos archivos en R podemos aplicar las funciones
read.csv()o bienread_csv(), esta última también perteneciente al paquete readr.
3.3 Formato xlsx
- Los archivos de Microsoft Excel, con extensión xlsx (xls para versiones anteriores a Office 2007), constituyen sin duda uno de los formatos más comunes de almacenamiento y edición de bases de datos.
Datos Precios de Autos - Formato xlsx
- Para poder importarlos a R recomendamos emplear la función
read_excel()del paquete readxl, la cual nos da la posibilidad de elegir la hoja de cálculo que nos interesa y seleccionar rangos específicos dentro de ella:
library(readxl)
read_excel(
path = "C:/Mis Documentos/ArchivoImportante.xlsx", #Ruta del archivo
sheet = "Hoja3", #Nombre de la hoja de cálculo que queremos leer
range = "B4:N88" #Rango de celdas que queremos leer
)Al aplicar esta función obtenemos un objeto en R de clase tibble.
Existen paquetes como tidyxl que permiten importar datos desde archivos Excel incorporando los formatos de estilo puntuales de cada celda (color de relleno, texto en negrita, etc.). Si bien esta idea no es 100% compatible con el concepto de tidy data, puede ser una buena opción cuando la información contenida en las hojas de cálculo no sigue una estructura tradicional.
Dentro del ámbito de la Ciencia de Datos, Excel posee cierta mala fama, muchas veces por culpa de usuarios/as desprevenidos que causan desastres estadísticos (recordemos los casos mencionados sobre pérdida de datos sobre Covid y problemas en la nomenclatura de genes).
Si bien puede resultar muy útil cuando trabajamos con pocos datos o en ejercicios simples, no recomendamos emplear Excel para un análisis estadístico formal ya que no fue creado para tal fin: las herramientas que ofrece son escasas (o peores) en comparación a las disponibles en otros programas.
Además, el hecho de no ser gratuito (salvo en versiones específicas para estudiantes, como Office 365) y de no permitir llevar un registro de todos los pasos tomados (investigación reproducible), constituyen serias desventajas a la hora de usar Excel como software de análisis de datos.
Más allá de los obstáculos mencionados, Excel posee muchas virtudes que lo posicionan como una herramienta fundamental a la hora de organizar y guardar datos.
3.4 Otros Formatos
pdf: Si bien no es estrictamente un formato de almacenamiento de datos, muchas veces nos vemos obligados/as a extraer datos que se encuentran publicados dentro de un reporte o informe guardado en formato pdf. En estos casos podemos aplicar las funciones
pdf_text()opdf_data()del paquete pdftools para incorporar los datos a R, aunque es probable que luego de la importación sea necesario un proceso de edición, muchas veces tedioso, para convertir el texto leído a una base de datos formal.html: Tal como ocurre con los pdf, la enorme cantidad de información disponible en páginas web ha repercutido notablemente en la popularidad de este formato de archivo en el contexto del almacenamiento de datos, generalmente con estructuras no tradicionales. Para importar archivos html a R utilizaremos los paquetes xml2 y rvest, los cuales estudiaremos más en detalle en la unidad dedicada a Web Scraping.
Software estadístico: Si bien no repasaremos estos casos a lo largo de la materia, usuarios/as de SAS, Stata, SPSS, Minitab o Matlab (entre otros) tienen la posibilidad de importar sus datos a R sin problemas. Para estos casos, aconsejamos revisar las funciones del paquete haven, que forma parte del tidyverse.
Formatos específicos: Muchas ramas de las ciencias aplicadas poseen formatos de almacenamiento de datos inherentes a su propia área. Los epidemiólogos utilizan salidas de Epi Info; quienes trabajan con datos geoespaciales utilizan archivos shp o geojson (entre tantos otros); aquellos fundamentalistas de R guardan sus datos en formato RData o rds, etc. Por suerte para nosotros/as, existen funciones o paquetes específicos de R que nos ayudan a importar archivos en la gran mayoría de los formatos más comunes, lo cual incluye todo lo mencionado anteriormente e incluso imágenes (png, jpg, bmp, etc.). Nombrar todas las posibilidades nos llevaría un curso entero; en cualquiera de estos casos recomendamos una simple búsqueda en Google que nos indique qué camino tomar, o bien consultar este manual oficial de R sobre importación y exportación de datos.
4 Problemas Frecuentes
- Muchos problemas que surgen durante la etapa de importación de la base son fáciles de pasar por alto. A continuación repasaremos algunos de los inconvenientes más comunes que podemos encontrar al importar datos.
4.1 Datos faltantes
Problema: el archivo que quiero importar tiene datos faltantes
- Esto es algo que ocurre con frecuencia y no necesariamente es un problema.
- Si en nuestros archivos hay valores faltantes, ya sea porque son datos perdidos o porque sencillamente no corresponde su existencia, debemos dejar la celda vacía en Excel, o bien no escribir nada en el lugar correspondiente para archivos de texto.
- Al importar el archivo, R detectará esos espacios vacíos y los completará con el valor lógico
NA, que quiere decir, Not Available o no disponible. - Si nuestros archivos usan otra palabra o caracter especial para representar valores faltantes, debemos aclarárselo a R en la opción dedicada para ese fin en el menú de importación:
#Hoja de cálculo donde un guión o una X indican valores faltantes
read_excel("MiArchivo.xlsx", na = c("-", "X"))4.2 Delimitación de columnas
Problema: El dataset importado tiene sólo una columna, pero debería haber más
- Probablemente importamos un archivo como si estuviese separado por comas o tabulaciones, cuando en realidad no era así.
- Arreglo: inspeccionar el archivo para determinar cuál es el delimitador correcto de los datos y realizar la importación otra vez, teniéndolo en cuenta.
- Cualquier caracter puede servir de delimitador, sólo debemos notificárselo a
Ral momento de levantar la base:
#Archivo separado por arrobas
read_delim("MiArchivo.txt", delim = "@")4.3 Rango equivocado
Problema: El dataset importado tiene más columnas/filas de lo que debería (con muchos NAs)
Este problema se obtiene al trabajar con archivos de Excel, donde se han guardado algunas columnas o filas vacías (sin datos) pero que poseen un formato diferente al resto.
En estos casos R entiende que esas celdas contienen información a pesar de estar vacías, y las incorpora al dataset con muchos valores faltantes (
NA).Para corregir este error, podemos borrar las celdas culpables directamente en Excel o bien filtrar el dataset en R para quedarnos con la sección que nos interesa.
4.4 Tipo de variables
Problema: Las variables del dataset importado no son del tipo que deberían
Es común observar este inconveniente cuando la base de datos importada posee números almacenados con una coma, los cuales serán interpretados erróneamente como texto. Dado que la mayoría de los lenguajes de programación fueron desarrollados por personas de habla inglesa, el símbolo usado por defecto para separar la parte entera de la decimal es el punto. Podemos corregir este comportamiento mediante el argumento dec en
read.table()o bien a través del argumento locale enread_delim().Pasar por alto este detalle puede llevarnos a problemas de cambio de escala involuntarios: si nuestro archivo posee el número mil quinientos almacenado con separador de miles ("1.500"), es probable que tras la importación el software lo convierta automáticamente a 1,5.
Las funciones que hemos visto hasta ahora tienen por costumbre adivinar el tipo de variable correspondiente a cada columna haciendo un escaneo rápido por las primeras filas de la base. Por ejemplo, el paquete readr decide qué clase asignar a las variables (numérica, textual, fecha, lógica, etc.) en base a las primeras 1.000 filas del archivo.
Si bien esto parece a priori una idea razonable, ciertas bases de datos pueden poseer una gran cantidad de valores faltantes. Imaginemos una columna con 6.000 observaciones, donde las primeras 2.000 corresponden al valor lógico
NAy las siguientes 4.000 son números: en este caso se le asignará la clasificación logical a esa columna, perdiéndose la información numérica que se encuentra a continuación.Para evitar estos problemas se recomienda aclarar en el proceso de importación la clase de variable correspondiente a cada columna del dataset, mediante los argumentos correspondientes a cada función (colClasses en
read.table(), col_types enread_delim(), etc.). Si no conocemos de antemano las características de cada variable, también es posible aumentar la cantidad de casos a estudiar para tener menor probabilidad de error (ver argumento guess_max).
4.5 Codificación
Problema: aparecen caracteres raros cuando importo la base
Uno de los más comunes consiste en definir erróneamente la codificación (encoding) del archivo a importar, con lo cual ciertos símbolos de uso común en idioma español (ñ, letras con tilde, etc.) no se visualizarán correctamente.
En estos casos es importante conocer el encoding utilizado por el archivo: los más comunes son
UTF-8,ASCII,ISO-8859-1yANSI, entre otros. Si trabajamos con R, todas las funciones populares de importación de bases brindan la opción de definir el encoding correcto; únicamente debemos estar atentos si la codificación de nuestro archivo difiere del default considerado por la función que usamos.
4.6 El archivo no existe
Problema: R no encuentra el archivo que queremos leer
Esto ocurre cuando R no encuentra el archivo que le indicamos, resultando generalmente en un mensaje del estilo:
- Error: 'archivo.txt' does not exist in current working directory
- Error in file(file, "rt") : cannot open the connection
- cannot open file 'archivo.txt': No such file or directory
- Es probable que hayamos escrito mal el nombre y/o ruta del archivo (siempre chequear puntuaciones, mayúsculas o minúsculas, etc.) o bien que se encuentre en una carpeta distinta a la indicada (revisar si está guardado en el working directory actual o bien en otra carpeta de nuestra PC).
4.7 Consejos Generales
Automatizar el proceso de importación lo máximo posible, evitando a toda costa el ingreso manual de información. Las encuestas en papel, el copiado a mano de datos entre una base y otra, etc. son cosas del pasado.
Contar con un buen sistema de resguardo de archivos (back-up), documentar todas las decisiones tomadas durante el procesamiento de los datos, y nunca eliminar la base original.
En procesos automáticos de recolección, chequear frecuentemente que los servidores tengan suficiente espacio para guardar las bases generadas, evitando la pérdida o truncamiento de datos. Si el proceso de recolección automática depende de una conexión a Internet, buscar "agujeros" en los datos que puedan haberse producido por cortes en el servicio.
En lo posible, unificar desde un principio las bases de datos. Si mi proceso de recolección ocurre a lo largo de 10 días, no es buena idea armar una nueva base para cada día, ya que perderemos tiempo unificando las bases y corremos el riesgo de elegir nombres de variables o criterios diferentes en cada una de ellas, haciéndolas incompatibles. Una buena idea es crear una única base, agregando por ejemplo una nueva columna donde se indique el día al que corresponde cada registro.
5 Datos: ventas de insumos de oficina
- A lo largo de este curso utilizaremos un conjunto de datos sobre una gran tienda estadounidense de ventas minoristas de insumos, amoblamiento y tecnología para oficinas.
El archivo
insumos.xlsxcontiene los registros de las ventas realizadas durante 4 años, con las siguientes variables:- row_id: identificación única de cada fila del conjunto de datos
- order_id: identificación única de cada pedido
- order_date: fecha en que se pide el producto
- ship_date: fecha de envío del producto
- ship_mode: modalidad de envío
- customer_id: identificador único del cliente
- customer_name: nombre del cliente
- segment: segmento o grupo de marketing al que pertenece el cliente, en base a sus intereses o características demográficas
- country: país de destino del envío
- city: ciudad y estado de destino del envío
- postal_code: código postal de destino del envío
- region: región geográfica de destino del envío (1: Central, 2: East, 3: South, 4: West)
- product_id: identificador único del producto
- category: categoría que engloba productos de características similares
- subcategory: subdivisión a la que pertenece el producto dentro de su categoría
- product_name: nombre del producto
- sales: valor monetario de la transacción entre la tienda y el cliente, en USD
- quantity: número de productos comercializados en la transacción
- discount: porcentaje de deducción monetaria con respecto al precio habitual del producto
- profit: ganancia en USD por la transacción
Así lucen los primeros 50 registros:
- Utilizaremos estos datos para poner en práctica herramientas dedicadas a la manipulación, procesamiento, control, resumen y visualización, entre otras tareas que hacen al análisis exploratorio de datos.
- Comenzamos preguntándonos...
Estos datos, ¿se presentan en un formato que puede considerarse ordenado o no?
6 Importación de datos en R
Llegó el momento de cargar los datos en R a partir del archivo
insumos.xlsx.RStudio provee ayuda para importar datos mediante el botón
Import Datasetdel panel superior derecho:
RStudio despliega una batería de opciones para la importación: tenemos la posibilidad de importar bases desde Excel, desde archivos de texto y también desde otros programas (SPSS, SAS, Stata).
La primera vez que realizamos esta acción, puede que RStudio pida permiso para instalar o actualizar algunos paquetes (Aceptar!).
Este modo de importar datos también nos muestra cuales son las sentencias correspondientes. Aconsejamos copiarlas y guardarlas en nuestro script, para evitar repetir este proceso la próxima vez que nos sentemos a trabajar (un script sin las sentencias de importación de datos está incompleto).
De hecho, a medida que nos familiarizamos con
R, utilizaremos cada vez menos el menú de RStudio y comenzaremos a escribir manualmente las líneas de código que permiten realizar la importación.
library(readxl)
datos <- read_excel("datos/insumos.xlsx")6.1 Explorar los datos importados
Podemos ver que nuestro flamante dataset figura ahora en la pestaña Environment junto con todas las otras cosas que están pasando por la cabeza de R en este momento.
Si hacemos click sobre el dataset en ese panel, se abrirá una ventana mostrándolo.
Lo mismo conseguimos con la función
View("nombredeldataset").Un paso razonable consiste en asegurarse que los datos que R acaba de leer realmente sean los que queríamos.
- Algunas cosas que podemos chequear (recordar la sección anterior sobre problemas frecuentes):
- Número correcto de filas y columnas
- Nombres correctos para las variables
- Tipos de variables (por ejemplo, R reconoció variables numéricas como tales y no como caracteres)
- Codificación de caracteres
- Etc.
Podemos explorar los datos cargados con algunas funciones básicas de R:
names()nos da los nombres asignados a cada columna (variable).head()devuelve las primeras seis líneas del dataset (y adiviná qué hacetail()??).dim()nos dice el número de filas y columnas.str()describe toda la estructura del dataset, más o menos combinando toda la información anterior.summary()es una función que se puede aplicar sobre distintos tipos de objetos. Cuando se la usa sobre un dataset, muestra un pequeño resumen de cada variable.
names(datos) [1] "row_id" "order_id" "order_date" "ship_date"
[5] "ship_mode" "customer_id" "customer_name" "segment"
[9] "country" "city" "postal_code" "region"
[13] "product_id" "category" "subcategory" "product_name"
[17] "sales" "quantity" "discount" "profit"
head(datos)# A tibble: 6 x 20
row_id order_id order_date ship_date ship_mode customer_id customer_name
<dbl> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 CA-2018~ 1/3/2018 1/7/2018 Standard~ DP-13000 Darren Powers
2 2 CA-2018~ 1/4/2018 1/8/2018 Standard~ PO-19195 Phillina Ober
3 3 CA-2018~ 1/4/2018 1/8/2018 Standard~ PO-19195 Phillina Ober
4 4 CA-2018~ 1/4/2018 1/8/2018 Standard~ PO-19195 Phillina Ober
5 5 CA-2018~ 1/5/2018 1/12/2018 Standard~ MB-18085 Mick Brown
6 6 CA-2018~ 1/6/2018 1/8/2018 Second C~ LS-17230 Lycoris Saun~
# ... with 13 more variables: segment <chr>, country <chr>, city <chr>,
# postal_code <dbl>, region <dbl>, product_id <chr>, category <chr>,
# subcategory <chr>, product_name <chr>, sales <dbl>, quantity <dbl>,
# discount <dbl>, profit <dbl>
dim(datos)[1] 9994 20
str(datos)tibble [9,994 x 20] (S3: tbl_df/tbl/data.frame)
$ row_id : num [1:9994] 1 2 3 4 5 6 7 8 9 10 ...
$ order_id : chr [1:9994] "CA-2018-103800" "CA-2018-112326" "CA-2018-112326" "CA-2018-112326" ...
$ order_date : chr [1:9994] "1/3/2018" "1/4/2018" "1/4/2018" "1/4/2018" ...
$ ship_date : chr [1:9994] "1/7/2018" "1/8/2018" "1/8/2018" "1/8/2018" ...
$ ship_mode : chr [1:9994] "Standard Class" "Standard Class" "Standard Class" "Standard Class" ...
$ customer_id : chr [1:9994] "DP-13000" "PO-19195" "PO-19195" "PO-19195" ...
$ customer_name: chr [1:9994] "Darren Powers" "Phillina Ober" "Phillina Ober" "Phillina Ober" ...
$ segment : chr [1:9994] "Consumer" "Home Office" "Home Office" "Home Office" ...
$ country : chr [1:9994] "United States" "United States" "United States" "United States" ...
$ city : chr [1:9994] "Houston, Texas" "Naperville, Illinois" "Naperville, Illinois" "Naperville, Illinois" ...
$ postal_code : num [1:9994] 77095 60540 60540 60540 19143 ...
$ region : num [1:9994] 1 1 1 1 2 4 3 3 3 3 ...
$ product_id : chr [1:9994] "OFF-PA-10000174" "OFF-LA-10003223" "OFF-ST-10002743" "OFF-BI-10004094" ...
$ category : chr [1:9994] "Office Supplies" "Office Supplies" "Office Supplies" "Office Supplies" ...
$ subcategory : chr [1:9994] "Paper" "Labels" "Storage" "Binders" ...
$ product_name : chr [1:9994] "Message Book, Wirebound, Four 5 1/2\" X 4\" Forms/Pg., 200 Dupl. Sets/Book" "Avery 508" "SAFCO Boltless Steel Shelving" "GBC Standard Plastic Binding Systems Combs" ...
$ sales : num [1:9994] 16.45 11.78 272.74 3.54 19.54 ...
$ quantity : num [1:9994] 2 3 3 2 3 3 3 9 2 2 ...
$ discount : num [1:9994] 0.2 0.2 0.2 0.8 0.2 0 0 0 0 0 ...
$ profit : num [1:9994] 5.55 4.27 -64.77 -5.49 4.88 ...
summary(datos) row_id order_id order_date ship_date
Min. : 1 Length:9994 Length:9994 Length:9994
1st Qu.:2499 Class :character Class :character Class :character
Median :4998 Mode :character Mode :character Mode :character
Mean :4998
3rd Qu.:7496
Max. :9994
ship_mode customer_id customer_name segment
Length:9994 Length:9994 Length:9994 Length:9994
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
country city postal_code region
Length:9994 Length:9994 Min. : 1040 Min. :1.000
Class :character Class :character 1st Qu.:23223 1st Qu.:2.000
Mode :character Mode :character Median :57103 Median :2.000
Mean :55245 Mean :2.571
3rd Qu.:90008 3rd Qu.:4.000
Max. :99301 Max. :4.000
NA's :11
product_id category subcategory product_name
Length:9994 Length:9994 Length:9994 Length:9994
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
sales quantity discount profit
Min. : 0.444 Min. : 1.00 Min. :0.0000 Min. :-6599.978
1st Qu.: 17.280 1st Qu.: 2.00 1st Qu.:0.0000 1st Qu.: 1.729
Median : 54.490 Median : 3.00 Median :0.2000 Median : 8.666
Mean : 229.858 Mean : 3.79 Mean :0.1562 Mean : 28.657
3rd Qu.: 209.940 3rd Qu.: 5.00 3rd Qu.:0.2000 3rd Qu.: 29.364
Max. :22638.480 Max. :14.00 Max. :0.8000 Max. : 8399.976
6.2 Directorio de trabajo
Al seguir los caminos "fáciles" que nos provee
RStudio, vemos que la sentencia que generó automáticamente la ventana de importación incluye el recorrido (o ruta) necesario para encontrar el archivo en nuestra compu.Como ya dijimos,
Rsiempre va a estar mirando en la carpeta que es el actualworking directory. Si nuestro archivo está guardado en dicha carpeta, entonces no necesitamos especificar toda la ruta.En este caso, proveer el nombre del archivo (por ejemplo
insumos.xlsx) será suficiente.Recordemos que podemos indicarle a
Rdónde mirar fijando elworking directoryen la carpeta que deseemos con la funciónsetwd().Por otro lado, si no deseamos cambiar nuestro working directory, podemos hacer referencia a otra carpeta de la compu con las siguientes estructuras:
| Taquigrafía | Significado |
|---|---|
| ~ | Directorio de inicio de la compu |
| . | Directorio actual (wd) |
| .. | Un directorio hacia arriba del wd actual |
| ../.. | Dos directorios hacia arriba del wd actual |
- Si, por ejemplo, el archivo se llama
archivo.xlsxy está guardado en una subcarpeta de nuestro directorio de trabajo actual, usamos:
datos <- read_xlsx("NombreSubCarpeta/archivo.xlsx")- Si está guardado en la carpeta superior a nuestro directorio actual:
datos <- read_xlsx("../archivo.xlsx")- Si está en otra carpeta dentro de la carpeta superior a nuestro directorio actual:
datos <- read_xlsx("../NombreOtraCarpeta/archivo.xlsx")7 Ejercicios
7.1 Películas
- La página web IMDb publica información acerca de más de 6 millones de películas y series de televisión, incluyendo datos sobre aproximadamente 10 millones de actores, actrices, directores/as, productores/as y demás personas involucradas en la industria cinematográfica.
En el archivo pelis.txt se encuentran almacenados datos sobre 400.000 películas, los cuales fueron adaptados a partir de una base mucho mayor publicada por IMDb, disponible en este link.
La base cuenta con 4 variables:
- Nombre: título de la película
- Año: año en que fue estrenada la película
- Dur: duración en minutos de la película
- Género: etiquetas que describen el género de la película (drama, ciencia ficción, comedia, etc.)
- Veamos sus primeras 10 filas:
| Nombre | Año | Dur | Género |
|---|---|---|---|
| Soldiers of the Cross | 1900 | NA | Biography,Drama |
| Bohemios | 1905 | 100 | NA |
| The Story of the Kelly Gang | 1906 | 70 | Biography,Crime,Drama |
| Robbery Under Arms | 1907 | NA | Drama |
| Amleto | 1908 | NA | Drama |
| Don Quijote | 1908 | NA | Drama |
| Don Álvaro o la fuerza del sino | 1908 | NA | Drama |
| The Fairylogue and Radio-Plays | 1908 | 120 | Adventure,Fantasy |
| El pastorcito de Torrente | 1908 | NA | Drama |
| Andreas Hofer | 1909 | NA | Drama |
Divididos en grupos, el ejercicio consiste en importar la base a R utilizando alguna de las siguientes 3 funciones:
read.table()de R Baseread_delim()del paquete readrfread()del paquete data.table
/
Una vez finalizado el proceso, cada equipo deberá comparar su experiencia, comentando acerca de:
- El tiempo empleado por la función en importar la base
- Los argumentos de la función que debieron ser definidos para una correcta importación
- La clase de objeto generado en R
- El resultado que se obtiene al imprimir el objeto en la Consola de RStudio
/
Para el proceso de importación es fundamental tener en claro ciertas características del archivo:
- Formato de codificación que posee
- Símbolo empleado como separador de columnas
- Manera de nombrar a los valores faltantes en cada variable
7.2 Bicicletas
Para ejemplificar el uso de funciones de importación de archivos en R, tomaremos prestado un conjunto de datos que se encuentra disponible en la Web de Datos Abiertos de la Municipalidad de Rosario.
La base a analizar contiene información sobre el uso del sistema Mi Bici Tu Bici, abarcando el período comprendido entre los meses de enero 2017 y enero 2019:
| Período | Viajes | UsuariosActivos | TiempoPromedio | ViajesDiaLaboral | ViajesDiaMedioFestivo | ViajesDiaFestivo | RankingEstaciones_1 | RankingEstaciones_2 | RankingEstaciones_3 | RankingEstaciones_4 | RankingEstaciones_5 | AbonosDiarios | AbonosMensuales | AbonosAnuales |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2017-01-01 | 12313 | 2002 | 19.6 | 459 | 273 | 227 | Pichincha | Distrito Centro | Paseo Pellegrini | Plaza López | Museo Castagnino | 3852 | 141 | 6 |
| 2017-02-01 | 12997 | 2105 | 18.9 | 557 | 255 | 327 | Pichincha | Distrito Centro | Paseo Pellegrini | Plaza López | Fac. de Ciencias Económicas | 3830 | 135 | 8 |
| 2017-03-01 | 16747 | 2399 | 19.5 | 606 | 319 | 429 | Pichincha | Distrito Centro | Paseo Pellegrini | Fac. de Ingeniería | Fac. de Ciencias Económicas | 4866 | 171 | 6 |
| 2017-04-01 | 14370 | 2326 | 18.1 | 638 | 318 | 269 | Pichincha | Fac. de Ingeniería | Fac. Ciencias Económicas | Paseo Pellegrini | Distrito Centro | 4257 | 168 | 23 |
| 2017-05-01 | 13210 | 1931 | 18.1 | 499 | 242 | 293 | Pichincha | Paseo Pellegrini | Fac. Ciencias Económicas | Fac. de Ingeniería | Distrito Centro | 3726 | 165 | 27 |
| 2017-06-01 | 10586 | 1567 | 19.1 | 400 | 267 | 231 | Pichincha | Paseo Pellegrini | Plaza López | Fac. Ciencias Económicas | Distrito Centro | 2898 | 123 | 12 |
| 2017-07-01 | 7528 | 1484 | 22.8 | 315 | 193 | 194 | Pichincha | Plaza López | Paseo Pellegrini | Distrito Centro | Fac. Ciencias Económicas | 2256 | 113 | 11 |
| 2017-08-01 | 19057 | 2828 | 19.1 | 705 | 305 | 464 | Fac. Ciencias Económicas | Paseo Pellegrini | Pichinca | Fac. de Ingeniería | Plaza López | 5904 | 291 | 27 |
| 2017-09-01 | 31819 | 4039 | 17.8 | 1196 | 738 | 841 | Fac. de Ingeniería | Paseo Pellegrini | Fac. Ciencias Económicas | Distrito Centro | Fac. Medicina | 8893 | 424 | 32 |
| 2017-10-01 | 46423 | 5533 | 18.0 | 1708 | 1136 | 1102 | Paseo Pellegrini | Fac. de Ingeniería | Fac. Ciencias Económicas | Fac. Medicina | Plaza López | 13951 | 629 | 26 |
| 2017-11-01 | 56656 | 6925 | 18.7 | 2078 | 1473 | 1426 | Paseo Pellegrini | Fac. de Ingeniería | Fac. Ciencias Económicas | Plaza López | Pichincha | 17121 | 679 | 31 |
| 2017-12-01 | 46246 | 6350 | 18.3 | 1793 | 1056 | 987 | Paseo Pellegrini | Fac. de Ingeniería | Pichinca | Fac. Ciencias Económicas | Plaza Sarmiento | 14085 | 524 | 35 |
| 2018-01-01 | 45724 | 6221 | 19.4 | 1660 | 1017 | 1027 | Pichincha | Paseo Pellegrini | Museo Castagnino | Distrito Centro | Plaza López | 14674 | 648 | 13 |
| 2018-02-01 | 48931 | 6688 | 18.7 | 2032 | 1294 | 1196 | Plaza López | Paseo Pellegrini | Paseo Pellegrini II | Fac. Ciencias Económicas | Pichincha | 15612 | 637 | 30 |
| 2018-03-01 | 63386 | 7666 | 19.1 | 2409 | 1256 | 1302 | Plaza López | Pichincha | Fac. de Ingeniería | Paseo Pellegrini II | Fac. Ciencias Económicas | 19330 | 771 | 26 |
| 2018-04-01 | 60489 | 7476 | 17.9 | 2456 | 1230 | 1078 | Fac. Ciencias Económicas | Paseo Pellegrini | Plaza López | Paseo Pellegrini II | Fac. Medicina | 16668 | 824 | 48 |
| 2018-05-01 | 53293 | 6860 | 18.0 | 1930 | 1385 | 1204 | Paseo Pellegrini | Fac. Ciencias Económicas | Plaza López | Pichincha | Fac. Medicina | 15331 | 752 | 30 |
| 2018-06-01 | 45573 | 5656 | 17.1 | 1860 | 1030 | 1016 | Paseo Pellegrini | Pichincha | Fac. Ciencias Económicas | Plaza López | Paseo Pellegrini II | 12049 | 580 | 32 |
| 2018-07-01 | 36227 | 4881 | 17.3 | 1321 | 849 | 850 | Pichincha | Paseo Pellegrini | Plaza Sarmiento | Plaza López | Paseo Pellegrini II | 9717 | 511 | 11 |
| 2018-08-01 | 54099 | 6302 | 17.3 | 1984 | 1215 | 1118 | Pichincha | Paseo Pellegrini | Plaza Sarmiento | Plaza López | Fac. Ciencias Económicas | 14873 | 690 | 21 |
| 2018-09-01 | 75150 | 7947 | 17.7 | 3070 | 1747 | 1615 | Paseo Pellegrini | Fac. de Ingeniería | Plaza López | Pichincha | Plaza Sarmiento | 18995 | 952 | 56 |
| 2018-10-01 | 79568 | 7925 | 17.2 | 2844 | 2008 | 1792 | Paseo Pellegrini | Plaza Sarmiento | Fac. Medicina | Plaza López | Fac. de Ingeniería | 19616 | 1021 | 36 |
| 2018-11-01 | 76932 | 7915 | 17.6 | 2908 | 1901 | 1654 | Paseo Pellegrini | Plaza Sarmiento | Fac. Ciencias Económicas | Plaza López | Fac. de Ingeniería | 18977 | 903 | 42 |
| 2018-12-01 | 64743 | 7166 | 18.6 | 2520 | 1548 | 1548 | Plaza Sarmiento | Pichincha | Plaza López | Paseo Pellegrini | Fac. de Ingeniería | 17430 | 679 | 53 |
| 2019-01-01 | 59427 | 6305 | 18.0 | 2152 | 1556 | 1170 | Pichincha | Paseo Pellegrini | Plaza López | Plaza Sarmiento | Plaza Pringles | 14910 | 695 | 42 |
/
Las variables presentes en la base son:
- Período: Mes y año informados.
- Viajes: Cantidad de viajes realizados en el período informado.
- UsuariosActivos: Cantidad de usuarios que realizaron al menos un viaje en el período informado.
- TiempoPromedio: Duración promedio (en minutos) de los viajes realizados en el período informado.
- ViajesDiaLaboral: Cantidad de viajes en días laborales en el período informado / cantidad de días laborales en el período informado.
- ViajesDiaMedioFestivo: Cantidad de viajes en días medio festivos en el período informado / cantidad de días medio festivos en el período informado.
- ViajesDiaFestivo: Cantidad de viajes en días festivos en el período informado / cantidad de días festivos en el período informado.
- RankingEstaciones_1: Estación en la ubicación n° 1 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
- RankingEstaciones_2: Estación en la ubicación n° 2 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
- RankingEstaciones_3: Estación en la ubicación n° 3 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
- RankingEstaciones_4: Estación en la ubicación n° 4 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
- RankingEstaciones_5: Estación en la ubicación n° 5 en el ranking respecto de la totalidad de retiros y devoluciones de bicicletas de la misma en el período informado.
- AbonosDiarios: Cantidad de suscripciones diarias adquiridas por los usuarios en el período informado.
- AbonosMensuales: Cantidad de suscripciones mensuales adquiridas por los usuarios en el período informado.
- AbonosAnuales: Cantidad de suscripciones anuales adquiridas por los usuarios en el período informado.
El objetivo de este ejercicio es poner en práctica algunas herramientas básicas de importación de bases de datos en R.
Divididos en grupos, deberán resolver las siguientes consignas:
- Importar la base a RStudio usando la función
read_delim()de readr, ya sea mediante código escrito a mano o desde el menú de importación de RStudio. - Explorar el dataset importado mediante las funciones
dim(),nrow(),ncol(),colnames(),str()ysummary(). ¿Qué tipo de información provee cada una? - ¿Detectan variables leídas incorrectamente, ya sea en cuanto a magnitud o formato?
- ¿Qué ocurre si no especificamos la codificación del archivo?
- ¿Y si no usamos el separador correcto?
- Importar la base a RStudio usando la función